/***************************************************************************************************
*Copyright(C),2010-2016,Sumscope
*FileName	:  date.h
*Author	:  scofined.qi
*Version	:  1.0
*Date		:  2015/12/18
*Desc		:  //用于主要说明此程序文件完成的主要功能
*Relation :  
*Others	:  //其他内容说明
*Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
*History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "../strings/BaseString.h"
#include "../core.h"

namespace qb{
	namespace base{
		time_t S_CORE_EXPORT getTimeFromInt(int date);
		time_t S_CORE_EXPORT make_time(int year, int month, int day, int hour = 0, int minute = 0, int second = 0);
		/*
			2011-11-23
			返回当地时间0点的秒数，输入参数为gmt秒数，由time(NULL)返回 ;
			*/
		time_t S_CORE_EXPORT calc_date(time_t time, int& year, int& month, int& day, int& wday);

        struct S_CORE_EXPORT IntDate{
			static unsigned int timeToInt(time_t time);
			static time_t IntToTime(unsigned int date);
			static void UpdateCache();
		};
        class date{
		private:
			time_t time_ ;
			int year_ ;		//年2011
			int month_ ;	//月1...12
			int day_ ;		//日期1...31
			int wday_ ;		//周1...7

			BaseString datestr_ ;

			int calc_stage_ ;
		public:
			date() ;
			date(time_t ts) ;
			date(int year , int month , int day) ;
			void reset() ;

			date& operator=(time_t ts) ;
			bool operator==(time_t ts) ;
			bool operator!=(time_t ts) ;

			bool operator==(const date& d) ;
			bool operator!=(const date& d) ;

			bool operator<(const date& d) ;
			bool operator<=(const date& d) ;
			bool operator>(const date& d) ;
			bool operator>=(const date& d) ;

			BaseString& to_string() ;
			time_t time() ;
			time_t gmttime() ;
			bool calc_now() ;

			inline int year() const {return year_ ;}
			inline int month() const {return month_ ;}
			inline int day() const {return day_ ;}
			inline int wday() const {return wday_ ;}

			date& next_day(int dc = 1) ;

			static date& today() ;
			static int timezone() ;
		} ;

        class utime{
		protected:
			int hour_ ;
			int minute_ ;
			int second_ ;
			int usec_ ;

			BaseString usecstr_ ;

			void calcutestr() ;
			int calc_stage_ ;
		public:
			utime(bool need_calc = false) ;//支持微秒
			~utime() ;

			void reset() ;
			/*
			2011-11-24
			micro必须是本地时间，乘以1,000,000。得到微秒
			*/
			void calc_now(int64_t micro = 0) ;

			inline int hour() const {return hour_ ;}
			inline int minute() const {return minute_ ;}
			inline int second() const {return second_ ;}
			inline int usec() const {return usec_ ;}

			BaseString& to_string() ;

			static int64_t now() ;
			const utime& operator=(const utime& src) ;
		} ;
	}//namespace base;
}//namespace qb;
